Python で Redshift の JDBC ドライバを使ってみる(JayDeBeApi)
Python から Redshift へ接続する方法で psycopg 以外の方法が無いものか探していた所 JayDeBeApi なるものを見つけました。Amazon 謹製の JDBC Driver を使えるかなということで試してみました。
テスト環境
- OS X 10.11.6, Java 8u112, Python 3.6.1, JayDeBeApi 1.1.1, RedshiftJDBC42-1.2.1.1001.jar
- Windows 7, Java 8u131, Python 2.7.13, JayDeBeApi 1.1.1, RedshiftJDBC42-1.2.1.1001.jar
※環境変数 JAVA_HOME の設定が必要です。
※本来 Python 3 の場合は JayDeBeApi3 を利用するようなのですが、エラーが発生してしまったので 1.1.1 で試しました。
Redshift JDBC ドライバの用意
コチラからダウンロードできます。任意の場所へ配置します。
JayDeBeApi のインストール
コチラの通り pip を用いてインストールできます。
$ pip install JayDeBeApi
Python インタプリタから Redshift へ接続
下記のように Redshift へ接続し一時テーブルを作成しました。
$ python Python 3.6.1 (default, Jun 2 2017, 19:53:52) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import jaydebeapi >>> conn = jaydebeapi.connect("com.amazon.redshift.jdbc.Driver", ... "jdbc:redshift://mycluster.us-east-1.redshift.amazonaws.com:5439/mydb", ... ["user", "password"], ... "/path/to/RedshiftJDBC42-1.2.1.1001.jar") >>> curs = conn.cursor() >>> curs.execute("create temp table item (name varchar(255), price integer, description text)") >>> curs.execute("insert into item values ('hoge', 1234, 'HogeHoge')") >>> curs.execute("insert into item values ('piyo', 2345, 'PiyoPiyo')") >>> curs.execute("insert into item values ('fuga', 3456, 'FugaFuga')") >>> curs.execute("select * from item")
SELECT 文を execute した後、fetchall で結果が取得できました。
>>> curs.execute("select * from item") >>> curs.fetchall() [('hoge', 1234, 'HogeHoge'), ('piyo', 2345, 'PiyoPiyo'), ('fuga', 3456, 'FugaFuga')] >>> curs.close() >>> conn.close() >>> exit() $
Windows の場合は Redshift JDBC ドライバのパス指定時にバックスラッシュのエスケープに気をつけてください。
# C:\path\to\RedshiftJDBC42-1.2.1.1001.jar "C:\\Path\\to\\RedshiftJDBC42-1.2.1.1001.jar"
まとめ
おもいのほか問題なく接続できたのでびっくりしました。Java 自体がマルチプラットフォームなので環境を選ばずに使用できるのがよいですね。Python から Redshift へクエリを発行したいケースで、選択肢のひとつになるではないかと思います。